/*******************************************************************************
 * FilePath    : \Software\Examples\MS1656_app_UART\Src\User\AH_Data.c
 * Version     : 1.0
 * Brief       : 
 * Author      : AndrewHu
 * Company     : Shanghai MacroGiga Electronics CO.,Ltd
 * Email       : Hubinbo@macrogiga.com
 * Date        : 2020-04-03 15:06:14
 * LastEditors : AndrewHu
 * LastEditTime: 2020-05-25 12:07:32
 * Description : 
 ******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include <Includes.h>
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function ----------------------------------------------------------*/
/* extern --------------------------------------------------------------------*/

/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/

/*******************************************************************************
 * Function    : Ascii2Hex
 * Brief       : 
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-03-24 18:23:15
 * Description : Convert Ascii to Hex,0x32->0x02
 ******************************************************************************/
u8 Ascii2Hex(u8 Ascii)
{
    if ((Ascii >= 'a') && (Ascii <= 'f'))
        return (Ascii - 'a' + 10);
    else if ((Ascii >= 'A') && (Ascii <= 'F'))
        return (Ascii - 'A' + 10);
    else if ((Ascii >= '0') && (Ascii <= '9'))
        return (Ascii - '0');
    else
        return 0x00; //??
}
/*******************************************************************************
 * Function    : Ascii2Hex_Double
 * Brief       : 
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-03-24 18:45:03
 * Description : Convert Ascii to Hex,{'1','2'}->0x12
 ******************************************************************************/
u8 Ascii2Hex_Double(u8 Ascii1, u8 Ascii2)
{
    u8 i;
    i = Ascii2Hex(Ascii1);
    i <<= 4;
    i |= Ascii2Hex(Ascii2);
    return i;
}
/*******************************************************************************
 * Function    : 
 * Brief       : 字符串转换成数组
 * Parameter   : {u8*} arry-转换结果
 * Parameter   : {u8*} str-转换前数据
 * Parameter   : {u8*} len-转换前(后)数据长度
 * Returns     : 
 * Date        : 2020-04-06 15:10:23
 * Description : "131415"->0x13,0x14,0x15
 ******************************************************************************/
void Str2Arry(u8 *arr, u8 *str, u8 *len)
{
    u8 i = 0, j = 0, data = 0;
    if ((*len) & 0x01)
    {
        //奇数个
        arr[j] = Ascii2Hex(str[i]);
        i++;
        j++;
        (*len)++;
    }

    (*len) >>= 1; //如果长度是奇数，第一个字节补0

    for (; j < (*len); j++)
    {
        data = Ascii2Hex(str[i]);
        i++;
        data <<= 4;
        arr[j] = data | Ascii2Hex(str[i]);
        i++;
    }
}
/*******************************************************************************
 * Function    : 
 * Brief       : 字符串转换成数组(倒序)
 * Parameter   : {u8*} arry-转换结果
 * Parameter   : {u8*} str-转换前数据
 * Parameter   : {u8*} len-转换前(后)数据长度
 * Returns     : 
 * Date        : 2020-04-06 15:10:23
 * Description : "131415"->0x15,0x14,0x13，注意数组不能溢出
 ******************************************************************************/
void Str2Arry_R(u8 *arr, u8 *str, u8 *len)
{
    u8 j = 0;
    u8 i = (*len);
    (*len) >>= 1;
    if (i & 0x01) //如果长度是奇数
        (*len)++;

    for (j = 0; j < (*len); j++)
    {
        i--;
        if (i == 0)
            arr[j] = 0;
        else
            arr[j] = Ascii2Hex(str[i - 1]);
        arr[j] <<= 4;
        arr[j] |= Ascii2Hex(str[i]);
        i--;
    }
}
/*******************************************************************************
 * Function    : Hex2Ascii
 * Brief       : 
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-03-24 18:26:19
 * Description : Convert Hex to Ascii,0x02->0x32('2')
 ******************************************************************************/
u8 Hex2Ascii(u8 Hex)
{
    Hex &= 0x0f;
    if (Hex >= 0x0a)
        return (Hex - 10 + 'A');
    else
        return (Hex + '0');
}
/*******************************************************************************
 * Function    : Hex2Dec
 * Brief       : 
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-03-25 11:52:40
 * Description : Convert Hex to Dec,0x86->0x0134
 ******************************************************************************/
u16 Hex2Dec(u8 hex)
{
    u16 i = 0;
    while (hex >= 100)
    {
        hex -= 100;
        i += 0x100;
    }

    while (hex >= 10)
    {
        hex -= 10;
        i += 0x10;
    }
    i += hex;
    return i;
}
/*******************************************************************************
 * Function    : Hex2DecAscii
 * Brief       : 
 * Parameter   : {u8} hex-The value to be converted
 * Parameter   : {u8*} string-retrun string index
 * Parameter   : {u8*} len-retrun lenght index
 * Returns     : 
 * Date        : 2020-03-25 12:00:13
 * Description : Convert Hex to Dec(Ascii),0x86->{'1','3','4'}
 ******************************************************************************/
void Hex2DecAscii(u8 hex, u8 *string, u8 *len)
{
    u8 i = 0;
    *len = 0;
    //100
    while (hex >= 100)
    {
        hex -= 100;
        i++;
    }
    if (i != 0)
    {
        string[*len] = Hex2Ascii(i);
        (*len)++;
    }
    //10
    i = 0;
    while (hex >= 10)
    {
        hex -= 10;
        i++;
    }
    if (i != 0)
    {
        string[*len] = Hex2Ascii(i);
        (*len)++;
    }
    //x
    string[*len] = Hex2Ascii(hex);
    (*len)++;
}
